/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

#ifndef SINEWAVEFORM_H
#define SINEWAVEFORM_H

#include "WaveformBase.h"

// Przestrzeń nazw
namespace RafMat
{
namespace SimEngine
{

/**
    Klasa generująca sygnał sinusoidalny.

    Klasa jest rodzaju WaveformBase i implementuje metodę do generowania
    funkcji sinus. Funkcja może być poddawana transformacjom takim jak
    przesunięcie w pionie, w fazie oraz wzmocnienie.
    Oczywiście 'ustawialny' jest również okres fali mierzony w próbkach.

    Wykorzystywane równanie: \f$ y(i) = A\sin\left(2\pi \frac{i}{T} + \varphi) + A_{off}\right) \f$
*/
class SineWaveform : public WaveformBase
{
public:
    /**
        Konstruktor tworzący obiekt generujący sygnał sinusoidalny.

        \param [in] sim Obiekt symulatora związany z tą instancją.
        \param [in] amplitude Amplituda sygnału sinusoidalnego.
        \param [in] period Okres sygnału w próbkach.
        \param [in] offset Przesunięcie sygnału w pionie.
        \param [in] phase Przesunięcie fazowe (wartości znormalizowane 0.0 - 1.0).
    */
    explicit SineWaveform(SimInterface::ISimulator& sim,
                            double amplitude = 1, double period = 25,
                            double offset = 0, double phase = 0);

    /**
        Zwraca aktualną wartość sygnału sinusoidalnego.

        \return Wartość zgodna z równaniem podanym w opisie klasy.
    */
    double getNextValue();
};

}   // SimEngine namespace
}   // RafMat namespace


#endif // SINEWAVEFORM_H
